Contents
Deep Learning for Language Modeling
Language model
Language model : 用來估計一個句子所出現的機率。
而句子是由一連串的詞(word)所組成的。
N-gram
那如何估算 $p$ 呢?
我們可以收集很多 data 然後直接計算 word sequence 所出現的機率 ,但很有可能這個句子根本沒出現在資料裡。
所以我們就把它拆成很多個詞來看,如圖中所示,如果只考慮前面一個 word 的話就是 2-gram(bigram) 。
NN-based LM
訓練一個 network ,以第一個來看,輸入是 潮水 和 退了 ,目標是 就 。然後我們去 minimize 輸出和
目標。
以 wreck a nice beach 來看,其句子出現的機率就是: (wreck 在句首的機率) 乘 (wreck 後面接 a 的機率) 乘…
而在 NN-based 中 我們並不是用統計來得到這些機率,而是 Network 的輸出。
RNN-based LM
如同 NN-based 一樣,輸入 begin => 輸出 潮水 , 潮水 => 退了 …
不同的地方是 到了 知道 時,它已經看了 [潮水、退了、就] 才決定出 知道 這個詞。
在 NN-base 中則是只看現在的輸入來預測。
接著計算起來就像是把每次 network 的輸出相乘在一起。
更進一步
N-gram
我們收集到的資料不夠多,無法正確統計。
以圖中例子來看,dog 也是有可能 jumped 的。
可以利用 smoothing 的方法,也就是不直接讓它機率為 0 ,而是一個比較小的機率。
Matrix Factorization :
將 n-gram 的機率建成一個 table,每一個空格表示的是,給一個 history 下一個出現某 vocabulary 的機率。
$p(jumped|cat)$ = cat 後面接 jumped 的機率
然而可以看到有很多格 0 ,但那只是因為資料中沒有,不代表它不存在。
要怎麼解決這個問題呢?
先將 vocabulary 和 history 變成向量 $v^i,h^j$ ,這個向量要從學習中產生。
而中間的元素則為 $n_{ij}$。
我們要去 minimizing $v,h$ 做內積後的值和 $n$ 越接近越好。(圖中的式子,也就是 loss function)
學完後,就能給每個詞彙一個 vector 了。
接著將 $n_{ij}$ 代換成 $v^i{\cdot}h^j$ , 就能取代掉原本的 0 了。
這樣做的好處在於如果兩個詞的向量相似,那他們對同個 $v$ 做內積的結果也會相似。
這跟一般 smoothing 差別在於,matrix factorization 有考慮到 這些詞彙的關係和意義。
NN-based LM
Matrix Factorization 是可以寫成 NN 的,首先要做個轉換,因為每個 history 的 column 是對上後面接那個 vocabulary 的機率,所以我們要讓每個 column 的和為 1 。
方法就是讓 $h,v$ 做完內積後,再丟去做 softmax ,接著在與 target(原本的 table ) 做比較(cross entropy)。
他們的 輸入 則是圖中橘色那塊,如果是 bigram ,輸入的維度就是 vocabulary size 。然後裡面的每一維與 hidden layer 相接的 weight 就是那一個 history 對應的 vector。
整個以 dog 為例,dog 那維是 1 ,其餘是 0 ,經過 hidden layer 後得到的就是 $h^dog$ 。
接著與 $v$ 做內積的部分又可以看成另一個 layer 再通過剛剛上面所講的過程。
還有一個好處是使用 NN-based 的話參數量遠小於 N-gram。(也就較不會 overfitting)
(嗚嗚開始寫黑板了…
RNN-based LM
用 RNN 的話我們又可以減少更多參數。
如果我們的 history 非常的長,一連串的 $w$,透過同樣的 f 最後產生出的 $h^t$ 就拿來代表 history 。
再經由和每個 vocabulary 內積,通過 softmax ,就能得到下一個詞彙($w_{t+1}$)的機率。
在訓練過程中 target 就是 $w_{t+1}$ 是哪一個詞,那一個就是 1 ,其餘是零(圖中右上)。